package br.unirio.ticketnator.dao;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
//import java.sql.CallableStatement;
import java.sql.ResultSet;
//import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import br.unirio.ticketnator.model.Componente;

public class ComponenteDAO implements IComponenteDAO 
{
	private Componente carrega (ResultSet rs) throws SQLException
	{
		Componente componente = new Componente();
		componente.setIdComponente(rs.getInt("id"));
		componente.setNomeComponente(rs.getString("nomecomponente"));
		componente.setEmailOperadorCriacao(rs.getString("nomeoperadorcriacao"));
		
		return componente;
	}
	
	@Override
	public Componente getComponente(int id)
	{
		Connection c = SupportDAO.getConnection();
		
		if(c == null)
			return null;
		Componente componente = null;
		try
		{
			PreparedStatement ps = c.prepareStatement("SELECT * FROM TB_COMPONENTE WHERE ID_Componente = id");
			ps.setLong(1, id);
			
			ResultSet rs = ps.executeQuery();
			
			if(rs.next())
				componente = carrega(rs);
			c.close();
				
		} catch (SQLException e)
		{
			SupportDAO.log(e.getMessage());
		}
		
		return componente;
	}
	
	@Override
	public int conta() 
	{
		Connection c = SupportDAO.getConnection();
		
		if(c == null)
			return 0;
		
		int numero = 0;
		
		try
		{
			PreparedStatement ps = c.prepareStatement("SELECT COUNT(*) FROM TB_COMPONENTE");
			ResultSet rs = ps.executeQuery();
			
			if(rs.next())
				numero = rs.getInt(1);
			
			c.close();
			
		} catch (SQLException e)
		{
			SupportDAO.log(e.getMessage());
		}
		
		return numero;
	}
	
	@Override
	public List<Componente> lista(int pagina, int tamanho) {
		
		Connection c = SupportDAO.getConnection();
		
		if(c == null)
			return null;
		
		List<Componente> lista = new ArrayList<Componente>();
		
		try
		{
			PreparedStatement ps = c.prepareStatement("SELECT * FROM TB_COMPONENTE ORDER BY  NOMECOMPONENTE LIMIT ? OFFSET ?");
			ps.setInt(1, tamanho);
			ps.setInt(2, pagina * tamanho);
			ResultSet rs = ps.executeQuery();
			
			while (rs.next())
				lista.add(carrega(rs));
			
			c.close();
			
		} catch (SQLException e)
		{
			SupportDAO.log(e.getMessage());
		}
		
		return lista;
	}
	
	@Override
	public boolean insereComponenteDAO(Componente componente)
	{
		
		Connection c = SupportDAO.getConnection();
		String insertComponente = "INSERT INTO TB_COMPONENTE"
				    +"(NOME_COMPONENTE, EMAIL_OPERADOR, SISTEMA_PERTENCENTE ) VALUES"
				    +"(?, ?, (SELECT ID_SISTEMA FROM TB_SISTEMA WHERE NOME_SISTEMA = ? ))";
		
		if (c == null)
			return false;
		
		try
		{
//			CallableStatement cs = c.prepareCall("{call InsereComponente(?, ?, ?, ?)}");
//			cs.setString(1, componente.getNomeComponente());
//			cs.setString(2, componente.getEmailOperadorCriacao());
//          cs.setInt(3, componente.getSistemaCorrespondente());
//			cs.registerOutParameter(4, Types.INTEGER);
//			
//			int id = cs.getInt(4);
//			componente.setIdComponente(id);
//			cs.execute();
//			
//			c.close();
			PreparedStatement ps = c.prepareStatement(insertComponente);
			ps.setString(1, componente.getNomeComponente());
			ps.setString(2, componente.getEmailOperadorCriacao());
			ps.setInt(3, componente.getSistemaPertencente());
			ps.executeUpdate();
			c.close();
			
			return true;
			
		} catch (SQLException e)
		{
			SupportDAO.log(e.getMessage());
			return false;
		}
	}
	
	@Override
	public boolean atualizaComponenteDAO(Componente componente)
	{
		Connection c = SupportDAO.getConnection();
		String updateComponente = "UPDATE TB_COMPONENTE"
		             +"SET NOME_COMPONENTE = ?"
		             +"EMAIL_OPERADOR = ?"
		             +"SISTEMA_PERTENCENTE = (SELECT ID_SISTEMA FROM TB_SISTEMA WHERE NOME_SISTEMA = ?)"
		             +"WHERE ID_COMPONENTE = ?"; 
		
		if (c == null)
			return false;
		try
		{
//			CallableStatement cs = c.prepareCall("{call AtualizaComponente(?, ?, ?)}");
//			cs.setInt(1, componente.getIdComponente());
//			cs.setString(2, componente.getNomeComponente());
//			cs.setString(3, componente.getEmailOperadorCriacao());
//			cs.execute();
//			c.close();
			
			PreparedStatement ps = c.prepareStatement(updateComponente);
			ps.setString(1, componente.getNomeComponente());
			ps.setString(2, componente.getEmailOperadorCriacao());
			ps.setInt(3, componente.getSistemaPertencente());
			ps.setInt(4, componente.getIdComponente());
			ps.executeUpdate();
			
			c.close();
			return true;
		
		} catch (SQLException e)
		{
			SupportDAO.log(e.getMessage());
			return false;
		}
	}
	
	@Override
	public boolean removeComponenteDAO(int id) 
	{
		Connection c = SupportDAO.getConnection();
		String deleteComponente = "DELETE FROM"
				              + "TB_COMPONENTE"
				              + "WHERE ID_COMPONENTE = ?";
		
		if (c == null)
			return false;
		try
		{
//			CallableStatement cs = c.prepareCall("{call RemoveComponente(?)}");
//			cs.setInt(1, id);
//			cs.execute();
//			c.close();
			
			PreparedStatement ps = c.prepareStatement(deleteComponente);
			ps.setInt(1, id);
			ps.executeUpdate();
			
			c.close();
			return true;
			
		} catch (SQLException e)
		{
			SupportDAO.log(e.getMessage());
			return false;
		}
	}
	

}
